package com.graficaluna.service.otros;

import com.graficaluna.dao.otros.DistribucionOrdenMaquinaDAO;
import com.graficaluna.service.pedido.ServicioOrdenTrabajo;
import dto.MaquinaDTO;
import dto.OrdenTrabajoDTO;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JasperRunManager;
import util.Util;

/**
 *
 * @author ralf
 */
public class ServicioDistribuicionOrdenesMaquinas {

    public List<OrdenTrabajoDTO> listarOrdenMaquina() {
        try {
            List<OrdenTrabajoDTO> lstOrden = new ServicioOrdenTrabajo().listarOrdenesTrabajo();
            List<MaquinaDTO> lstMaquina;

            for (OrdenTrabajoDTO ord : lstOrden) {
                lstMaquina = new DistribucionOrdenMaquinaDAO().listarOrdenMaquina(ord.getCodigo());
                String idMaquinas = "";
                for (MaquinaDTO m : lstMaquina) {
                    idMaquinas += m.getId() + ",";
                }
                if (!idMaquinas.isEmpty()) {
                    ord.setCodigoMaquinas(idMaquinas.substring(0, idMaquinas.length() - 1));
                }
            }
            return lstOrden;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void distribuirOrdenMaquinas() throws Exception {
        List<OrdenTrabajoDTO> listOrdenTrabajo = new ServicioOrdenTrabajo().listarOrdenesTrabajo();
        List<MaquinaDTO> listMaquina = new ArrayList<MaquinaDTO>();
        MaquinaDTO maquina;

        for (OrdenTrabajoDTO ord : listOrdenTrabajo) {
            if (!ord.isTieneMaquinas()) { // si la orden no tiene asignadas maquinas aun
                maquina = new MaquinaDTO();
                maquina.setTipoCarrera(ord.getTipoCarrera());
                maquina.setAsignado(false);
                listMaquina = new ServicioMaquina().listarMaquinasPorCarrera(maquina);
                if (!listMaquina.isEmpty()) {
                    if (ord.isAsignarVariasMaquinas()) {
                        int size = listMaquina.size();
                        int cantidadMax = 2;
                        for (int i = 0; i < size; i++) {
                            maquina = listMaquina.get(i);

                            ord.setCodigoMaquina(maquina.getId());
                            new DistribucionOrdenMaquinaDAO().insertarOrdenMaquina(ord);
                            maquina.setAsignado(true);
                            new ServicioMaquina().actualizarAsignacionMaquina(maquina);
                            ord.setTieneMaquinas(true);
                            new ServicioOrdenTrabajo().actualizarAsignacionMaquina(ord);
                            if (i == cantidadMax - 1) {
                                break;
                            }
                        }
                    } else {
                        maquina = listMaquina.get(0);
                        ord.setCodigoMaquina(maquina.getId());
                        new DistribucionOrdenMaquinaDAO().insertarOrdenMaquina(ord);
                        maquina.setAsignado(true);
                        new ServicioMaquina().actualizarAsignacionMaquina(maquina);
                        ord.setTieneMaquinas(true);
                        new ServicioOrdenTrabajo().actualizarAsignacionMaquina(ord);
                    }
                }
            }
        }
    }

    public void insertarOrdenMaquina(OrdenTrabajoDTO orden,String maquinaSelected) throws Exception {
        MaquinaDTO maquina = new MaquinaDTO();
        maquina.setId(new Long(maquinaSelected));
        maquina.setAsignado(true);
        new DistribucionOrdenMaquinaDAO().insertarOrdenMaquina(orden);
        new ServicioMaquina().actualizarAsignacionMaquina(maquina);
    }

    public void actualizarOrdenMaquinas(List<OrdenTrabajoDTO> lista) {
        DistribucionOrdenMaquinaDAO dao = new DistribucionOrdenMaquinaDAO();
        for (OrdenTrabajoDTO orden : lista) {
            dao.actualizarOrdenMaquina(orden);
        }
    }

    public void eliminarOrdenMaquina(OrdenTrabajoDTO orden) throws Exception {

        List<MaquinaDTO> lstMaquina = new DistribucionOrdenMaquinaDAO().listarOrdenMaquina(orden.getCodigo());
        for (MaquinaDTO m : lstMaquina) {
            m.setAsignado(false);
            new ServicioMaquina().actualizarAsignacionMaquina(m);
        }
        new DistribucionOrdenMaquinaDAO().eliminarOrdenMaquina(orden);
    }

    public byte[] verReporte(File archivo) {
        try {
            DistribucionOrdenMaquinaDAO dao = new DistribucionOrdenMaquinaDAO();
            Connection con = dao.obtenerConnexion();
            Map map = new HashMap();
            byte[] bytesArchivo = Util.getBytesFromFile(archivo);
            byte[] bytes = JasperRunManager.runReportToPdf(new ByteArrayInputStream(bytesArchivo), map, con);
            con.close();
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

}
